package Serializadores;

import java.io.File;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import tp3.Auto;
import tp3.Camioneta;
import tp3.Estado;
import tp3.Jugador;
import tp3.Moto;
import tp3.Obstaculo;

import tp3.Vehiculo;

public class SerializarVehiculo {
	
	
public Element serializar(Vehiculo vehiculo, String nombre) throws ParserConfigurationException{
		
		
		
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

		
	
		// Tag principal
		Document doc = docBuilder.newDocument();
		Element raiz = doc.createElement("Vehiculo");
		
		doc.appendChild(raiz);

		
	
		Element jugador =  (vehiculo.getJugador().serializar(nombre));
		doc.adoptNode(jugador); 
	 	raiz.appendChild(jugador);
		
	 	
	 	raiz.setAttribute("estado", vehiculo.getEstado().getClass().getName());
	 
	 		
		
	
		try{
		String nombreDelArchivo = nombre + ".xml";	
		// creo el archivo xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(new File(nombreDelArchivo));

		transformer.transform(source, result);
		}
		catch (TransformerException tfe) {
		tfe.printStackTrace();
	  }
		

	 
	return raiz;
	
	
	}

	

	
	public Vehiculo deserializar(String nombreDelArchivo){
		
		String archivo = nombreDelArchivo+".xml";
		
		
		try {
			//inicializo 
			File stocks = new File(archivo);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(stocks);
			doc.getDocumentElement().normalize();
			 // cargar dimensiones y crear tablero
			
			
			//--------------------------------------
			Vehiculo vehiculoRecuperado = new Vehiculo();
			
			
			//llamo al deserializador de la clase Jugador (metodo de clase)
			Jugador unJugador=Jugador.deserializar("J"+nombreDelArchivo);
			
			
			vehiculoRecuperado.setJugador(unJugador);
			
		
			
			NodeList nodes = doc.getElementsByTagName("Vehiculo");
				
				try {
					Class c;
					c = Class.forName(((Element) nodes.item(0)).getAttribute("estado"));
					Estado vehiculo = (Estado)c.newInstance();
					vehiculoRecuperado.setEstado(vehiculo);
					
					return vehiculoRecuperado; // devuelve el vehiculo. 
				}
			 catch (InstantiationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
				}
				 catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
		
				
		
			
			
			} catch (Exception ex) {
			ex.printStackTrace();
			
			
			
			}
		return null;
		
	}
		
}
	


